const Goods = require('../models/Goods');
const XLSX = require('xlsx');

class GoodsController {
  // 获取所有货物
  static getAllGoods(req, res) {
    // 检查是否有查询参数
    const queryParams = req.query;
    
    if (Object.keys(queryParams).length > 0) {
      // 有查询参数，使用查询功能
      Goods.findByQuery(queryParams, (err, goods) => {
        if (err) {
          return res.status(500).json({
            success: false,
            message: '查询货物列表失败',
            error: err.message
          });
        }
        
        res.json({
          success: true,
          data: goods
        });
      });
    } else {
      // 无查询参数，获取所有货物
      Goods.findAll((err, goods) => {
        if (err) {
          return res.status(500).json({
            success: false,
            message: '获取货物列表失败',
            error: err.message
          });
        }
        
        res.json({
          success: true,
          data: goods
        });
      });
    }
  }

  // 根据ID获取货物
  static getGoodsById(req, res) {
    const { id } = req.params;
    
    Goods.findById(id, (err, goods) => {
      if (err) {
        return res.status(500).json({
          success: false,
          message: '查询货物失败',
          error: err.message
        });
      }
      
      if (!goods) {
        return res.status(404).json({
          success: false,
          message: '货物未找到'
        });
      }
      
      res.json({
        success: true,
        data: goods
      });
    });
  }

  // 创建新货物
  static createGoods(req, res) {
    const {
      name, sku, quantity, location, status, batchNumber, expiryDate, specification, unit
    } = req.body;
    
    // 验证必填字段
    if (!name || !sku) {
      return res.status(400).json({
        success: false,
        message: '货物名称和SKU为必填项'
      });
    }
    
    const newGoods = new Goods(
      null,
      name,
      sku,
      quantity || 0,
      location,
      status || 'inStock',
      batchNumber,
      expiryDate,
      specification,
      unit || '件'
    );
    
    // 保存货物
    newGoods.save((err, result) => {
      if (err) {
        return res.status(500).json({
          success: false,
          message: '创建货物失败',
          error: err.message
        });
      }
      
      res.status(201).json({
        success: true,
        message: '货物创建成功',
        data: { id: result.id, ...newGoods }
      });
    });
  }

  // 更新货物
  static updateGoods(req, res) {
    const { id } = req.params;
    const {
      name, sku, quantity, location, status, batchNumber, expiryDate, specification, unit
    } = req.body;
    
    const goodsData = {
      name: name || '',
      sku: sku || '',
      quantity: quantity !== undefined ? quantity : 0,
      location: location || null,
      status: status || 'inStock',
      batchNumber: batchNumber || null,
      expiryDate: expiryDate || null,
      specification: specification || null,
      unit: unit || '件'
    };
    
    Goods.update(id, goodsData, (err, result) => {
      if (err) {
        return res.status(500).json({
          success: false,
          message: '更新货物失败',
          error: err.message
        });
      }
      
      if (!result.updated) {
        return res.status(404).json({
          success: false,
          message: '货物未找到'
        });
      }
      
      res.json({
        success: true,
        message: '货物更新成功'
      });
    });
  }

  // 删除货物
  static deleteGoods(req, res) {
    const { id } = req.params;
    
    Goods.delete(id, (err, result) => {
      if (err) {
        return res.status(500).json({
          success: false,
          message: '删除货物失败',
          error: err.message
        });
      }
      
      if (!result.deleted) {
        return res.status(404).json({
          success: false,
          message: '货物未找到'
        });
      }
      
      res.json({
        success: true,
        message: '货物删除成功'
      });
    });
  }

  // 导出库存总览为Excel
  static exportInventoryOverviewToExcel(req, res) {
    // 检查是否有查询参数
    const queryParams = req.query;
    
    const exportData = (goods) => {
      // 准备Excel数据 - 库存总览字段
      const excelData = goods.map(item => ({
        '编号': item.id,
        '单据号': `DOC${String(item.id).padStart(3, '0')}`,
        '物料编码': item.sku,
        '物料名称': item.name,
        '物料总数量': item.quantity,
        '规格型号': item.specification || '',
        '单位': item.unit || '件'
      }));
      
      // 创建工作簿
      const workbook = XLSX.utils.book_new();
      
      // 创建工作表
      const worksheet = XLSX.utils.json_to_sheet(excelData);
      
      // 设置列宽
      worksheet['!cols'] = [
        { wch: 8 },   // 编号
        { wch: 15 },  // 单据号
        { wch: 15 },  // 物料编码
        { wch: 20 },  // 物料名称
        { wch: 12 },  // 物料总数量
        { wch: 15 },  // 规格型号
        { wch: 10 }   // 单位
      ];
      
      // 将工作表添加到工作簿
      XLSX.utils.book_append_sheet(workbook, worksheet, '库存总览');
      
      // 设置响应头
      res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
      res.setHeader('Content-Disposition', 'attachment; filename=inventory_overview_export.xlsx');
      
      // 将工作簿写入响应
      const buffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'buffer' });
      res.end(buffer);
    };
    
    if (Object.keys(queryParams).length > 0) {
      // 有查询参数，使用查询功能
      Goods.findByQuery(queryParams, (err, goods) => {
        if (err) {
          return res.status(500).json({
            success: false,
            message: '查询货物列表失败',
            error: err.message
          });
        }
        
        exportData(goods);
      });
    } else {
      // 无查询参数，获取所有货物
      Goods.findAll((err, goods) => {
        if (err) {
          return res.status(500).json({
            success: false,
            message: '获取货物列表失败',
            error: err.message
          });
        }
        
        exportData(goods);
      });
    }
  }

  // 导出库存明细为Excel
  static exportInventoryDetailsToExcel(req, res) {
    // 检查是否有查询参数
    const queryParams = req.query;
    
    const exportData = (goods) => {
      // 准备Excel数据 - 库存明细字段
      const excelData = goods.map(item => {
        // 生成TP+5位自然数格式的托盘号
        const palletNumber = 'TP' + String(item.id).padStart(5, '0');
        
        return {
          '编号': item.id,
          '货位号': item.location || '-',
          '单据': `DOC${String(item.id).padStart(3, '0')}`,
          '托盘号': palletNumber,
          '物料编码': item.sku,
          '物料名称': item.name,
          '规格型号': item.specification || '',
          '物料数量': item.quantity,
          '单位': item.unit || '件',
          '写入日期': item.created_at ? new Date(item.created_at).toLocaleDateString('zh-CN') : '-'
        };
      });
      
      // 创建工作簿
      const workbook = XLSX.utils.book_new();
      
      // 创建工作表
      const worksheet = XLSX.utils.json_to_sheet(excelData);
      
      // 设置列宽
      worksheet['!cols'] = [
        { wch: 8 },   // 编号
        { wch: 15 },  // 货位号
        { wch: 15 },  // 单据
        { wch: 15 },  // 托盘号
        { wch: 15 },  // 物料编码
        { wch: 20 },  // 物料名称
        { wch: 15 },  // 规格型号
        { wch: 12 },  // 物料数量
        { wch: 10 },  // 单位
        { wch: 15 }   // 写入日期
      ];
      
      // 将工作表添加到工作簿
      XLSX.utils.book_append_sheet(workbook, worksheet, '库存明细');
      
      // 设置响应头
      res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
      res.setHeader('Content-Disposition', 'attachment; filename=inventory_details_export.xlsx');
      
      // 将工作簿写入响应
      const buffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'buffer' });
      res.end(buffer);
    };
    
    if (Object.keys(queryParams).length > 0) {
      // 有查询参数，使用查询功能
      Goods.findByQuery(queryParams, (err, goods) => {
        if (err) {
          return res.status(500).json({
            success: false,
            message: '查询货物列表失败',
            error: err.message
          });
        }
        
        exportData(goods);
      });
    } else {
      // 无查询参数，获取所有货物
      Goods.findAll((err, goods) => {
        if (err) {
          return res.status(500).json({
            success: false,
            message: '获取货物列表失败',
            error: err.message
          });
        }
        
        exportData(goods);
      });
    }
  }
}

module.exports = GoodsController;